#pragma once

#include "ctp_interface.h"
#include <string>
#include <memory>
#include <unordered_map>
#include <fstream>
#include <mutex>
#include "json.hpp"

namespace hft {

// 配置管理�?
class ConfigManager {
public:
    static ConfigManager& getInstance() {
        static ConfigManager instance;
        return instance;
    }
    
    // 加载配置文件
    bool loadConfig(const std::string& filename) {
        try {
            std::ifstream file(filename);
            if (!file.is_open()) {
                return false;
            }
            config_ = nlohmann::json::parse(file);
            return true;
        } catch (const std::exception& e) {
            return false;
        }
    }
    
    // 保存配置到文�?
    bool saveConfig(const std::string& filename) const;
    
    // 获取CTP配置
    CTPConfig getCTPConfig() const;
    
    // 获取交易参数
    struct TradingParams {
        double max_position;           // 最大持�?
        double max_order_size;         // 最大下单量
        double max_slippage;           // 最大滑�?
        int64_t min_liquidity;         // 最小流动�?
        double risk_limit;             // 风险限制
        int max_retry_count;           // 最大重试次�?
        int retry_interval_ms;         // 重试间隔(毫秒)
        int timeout_ms;                // 超时时间(毫秒)
    };
    TradingParams getTradingParams() const;
    
    // 获取性能监控参数
    struct MonitorParams {
        bool enable_latency_monitor;    // 启用延迟监控
        bool enable_throughput_monitor; // 启用吞吐量监�?
        bool enable_error_monitor;      // 启用错误监控
        int history_size;              // 历史数据大小
        std::string log_level;         // 日志级别
    };
    MonitorParams getMonitorParams() const;
    
    // 更新配置
    void updateCTPConfig(const CTPConfig& config);
    void updateTradingParams(const TradingParams& params);
    void updateMonitorParams(const MonitorParams& params);
    
    nlohmann::json getNode(const std::string& path) const {
        return config_[path];
    }
    
private:
    ConfigManager() = default;
    ~ConfigManager() = default;
    ConfigManager(const ConfigManager&) = delete;
    ConfigManager& operator=(const ConfigManager&) = delete;
    
    mutable std::mutex mutex_;
    CTPConfig ctp_config_;
    TradingParams trading_params_;
    MonitorParams monitor_params_;
    nlohmann::json config_;
    
    // 默认配置
    void setDefaultConfig();
    
    // 配置验证
    bool validateConfig() const;
};

} // namespace hft 